#include"Stack.h"
//
//void STInit(ST* ps)
//{
//	assert(ps);
//	ps->a = NULL;
//	ps->capacity = ps->top = 0;
//}
//
//void STDestory(ST* ps)
//{
//	assert(ps);
//	free(ps->a);
//	ps->a = NULL;
//	ps->capacity = ps->top = 0;
//}
//
//void STPush(ST* ps, STDataType x)
//{
//	assert(ps);
//	// 判断是否要扩容
//	if (ps->top == ps->capacity)
//	{
//		int newcapacity = ps->capacity == 0 ? 4 : ps->capacity * 2;
//		// 申请空间
//		STDataType* tmp = (STDataType*)realloc(ps->a, sizeof(STDataType) * newcapacity);
//		if (tmp == NULL)
//		{
//			perror("realloc fail");
//			return;
//		}
//		ps->a = tmp;
//		ps->capacity = newcapacity;
//	}
//	ps->a[ps->top] = x;
//	ps->top++;
//}
//
//void STPop(ST* ps)
//{
//	assert(ps);
//	ps->top--;
//}
//
//STDataType STTop(ST* ps)
//{
//	assert(ps);
//	return ps->a[ps->top-1];
//}
//
//int STSize(ST* ps)
//{
//	assert(ps);
//	return ps->top;
//}
//
//int STEmpty(ST* ps)
//{
//	assert(ps);
//	return ps->top == 0;
//}



void STInit(ST* ps)
{
	assert(ps);
	ps->a = NULL;
	ps->capacity = ps->top = 0;
}

void STDestory(ST* ps)
{
	assert(ps);
	free(ps->a);
	ps->a = NULL;
	ps->capacity = ps->top = 0;
}

void STPush(ST* ps, STDataType x)
{
	assert(ps);
	// 先判断是否要扩容
	if (ps->capacity == ps->top)
	{
		int newcapacity = ps->capacity == 0 ? 4 : ps->capacity * 2;
		// 申请空间
		STDataType* temp = (STDataType*)malloc(sizeof(STDataType) * newcapacity);
		if (temp == NULL)
		{
			perror("malloc fail!");
			return;
		}
		ps->a = temp;
		ps->capacity = newcapacity;
	}
	ps->a[ps->top] = x;
	ps->top++;
}

void STPop(ST* ps)
{
	assert(ps);

	ps->top--;
}

STDataType STTop(ST* ps)
{
	assert(ps);
	return ps->a[ps->top-1];
}

int STSize(ST* ps)
{
	assert(ps);
	return ps->top;
}
bool STEmpty(ST* ps)
{
	assert(ps);
	return ps->top == 0;
}